local S
if minetest.get_modpath("intllib") then
    S = intllib.Getter()
else
    S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end
end

local gravelnode
local cobblenode
if minetest.get_modpath("moreblocks")
    and minetest.registered_nodes["moreblocks:gravel_stonebrick"]
then
    gravelnode = "moreblocks:gravel_stonebrick"
end
if minetest.get_modpath("default") then
    gravelnode = gravelnode or "default:gravel"
    cobblenode = "default:cobble"
elseif minetest.get_modpath("mcl_core") then
    gravelnode = "mcl_core:gravel"
    cobblenode = "mcl_core:cobble"
end

function round_down(pos)
   return {x=math.floor(pos.x), y=math.floor(pos.y), z=math.floor(pos.z)}
end

function round_new(vec)
	return {x=math.floor(vec.x+0.5), y=math.floor(vec.y+0.3), z=math.floor(vec.z+0.5)}
end

advtrains.register_wagon("construction_train", {
	mesh="advtrains_subway_wagon.b3d",
	textures = {"advtrains_subway_wagon.png"},
	drives_on={default=true},
	max_speed=2,
	seats = {
		{
			name="Driver stand",
			attach_offset={x=0, y=10, z=0},
			view_offset={x=0, y=0, z=0},
			group="dstand",
		},
		{
			name="1",
			attach_offset={x=-4, y=8, z=8},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
		{
			name="2",
			attach_offset={x=4, y=8, z=8},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
		{
			name="3",
			attach_offset={x=-4, y=8, z=-8},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
		{
			name="4",
			attach_offset={x=4, y=8, z=-8},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
	},
	seat_groups = {
		dstand={
			name = "Driver Stand",
			access_to = {"pass"},
			require_doors_open=true,
			driving_ctrl_access=true,
		},
		pass={
			name = "Passenger area",
			access_to = {"dstand"},
			require_doors_open=true,
		},
	},
	assign_to_seat_group = {"pass", "dstand"},
	doors={
		open={
			[-1]={frames={x=0, y=20}, time=1},
			[1]={frames={x=40, y=60}, time=1},
			sound = "advtrains_subway_dopen",
		},
		close={
			[-1]={frames={x=20, y=40}, time=1},
			[1]={frames={x=60, y=80}, time=1},
			sound = "advtrains_subway_dclose",
		}
	},
	door_entry={-1, 1},
	visual_size = {x=1, y=1},
	wagon_span=2,
	--collisionbox = {-1.0,-0.5,-1.8, 1.0,2.5,1.8},
	collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0},
	is_locomotive=true,
	drops={"default:steelblock 4"},
	horn_sound = "advtrains_subway_horn",
	custom_on_step = function (self, dtime )
	   if self:train().velocity == 0 then
	      return
	   end
	   local rpos = round_new(self.object:get_pos())
	   rpos.y = rpos.y -1
	   -- Find train tracks, if we find train tracks, we will only replace blocking nodes
	   local tracks_below = false
	   for y =-1,0 do
	      for x = -2,2 do
		 for z = -2,2 do
		    local ps = {x=rpos.x+x, y=rpos.y+y, z=rpos.z+z}
		    if minetest.get_item_group(minetest.get_node(ps).name, "advtrains_track") > 0 then
		       tracks_below = true
		       break
		    end
		 end	      
	      end
	   end
	   for x = -1,1 do
	      for z = -1,1 do
		 local ps = {x=rpos.x+x, y=rpos.y, z=rpos.z+z}
		 local name = minetest.get_node(ps).name
		 if (not tracks_below) or (minetest.get_item_group(name, "not_blocking_trains") ==  0 and minetest.registered_nodes[name].walkable ) then
		    minetest.set_node(ps, {name = gravelnode})
		    ps.y = ps.y-1
		    if not minetest.registered_nodes[minetest.get_node(ps).name].walkable then
		       minetest.set_node(ps, {name = cobblenode})
		    end
		 end
	      end	      
	   end
	end,
	custom_on_velocity_change = function(self, velocity, old_velocity, dtime)
		if not velocity or not old_velocity then return end
		if old_velocity == 0 and velocity > 0 then
			minetest.sound_play("advtrains_subway_depart", {object = self.object})
		end
		if velocity < 2 and (old_velocity >= 2 or old_velocity == velocity) and not self.sound_arrive_handle then
			self.sound_arrive_handle = minetest.sound_play("advtrains_subway_arrive", {object = self.object})
		elseif (velocity > old_velocity) and self.sound_arrive_handle then
			minetest.sound_stop(self.sound_arrive_handle)
			self.sound_arrive_handle = nil
		end
		if velocity > 0 and (self.sound_loop_tmr or 0)<=0 then
			self.sound_loop_handle = minetest.sound_play({name="advtrains_subway_loop", gain=0.3}, {object = self.object})
			self.sound_loop_tmr=3
		elseif velocity>0 then
			self.sound_loop_tmr = self.sound_loop_tmr - dtime
		elseif velocity==0 then
			if self.sound_loop_handle then
				minetest.sound_stop(self.sound_loop_handle)
				self.sound_loop_handle = nil
			end
			self.sound_loop_tmr=0
		end
	end,
    has_inventory = true,
    get_inventory_formspec = advtrains.standard_inventory_formspec,
    inventory_list_sizes = {
        box=8*3
    },
}, S("Construction train"), "advtrains_subway_wagon_inv.png")
